package model

import (
	"errors"
	"fmt"
	"gorm.io/gorm"
	"homepage_srv/model"
	"smart-health-platforms/config"
	"time"
)

type Collection struct {
	Id        uint32         `gorm:"column:id;type:int UNSIGNED;primaryKey;not null;" json:"id"`
	GoodId    int32          `gorm:"column:good_id;type:int;default:NULL;" json:"good_id"`
	UserId    int32          `gorm:"column:user_id;type:int;default:NULL;" json:"user_id"`
	SkuId     int32          `gorm:"column:sku_id;type:int;default:NULL;" json:"sku_id"`
	Name      string         `gorm:"column:name;type:varchar(255);default:NULL;" json:"name"`
	Num       int32          `gorm:"column:num;type:int;default:NULL;" json:"num"`
	Price     float64        `gorm:"column:price;type:decimal(10, 2);default:NULL;" json:"price"`
	CreatedAt time.Time      `gorm:"column:created_at;type:datetime(3);default:CURRENT_TIMESTAMP(3);" json:"created_at"`
	UpdatedAt time.Time      `gorm:"column:updated_at;type:datetime(3);default:CURRENT_TIMESTAMP(3);" json:"updated_at"`
	DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:datetime(3);default:NULL;" json:"deleted_at"`
}

func (c *Collection) TableName() string {
	return "collection"
}

// 添加收藏
func (c *Collection) AddOrUpdateCollection() error {
	var existing Collection
	result := config.DB.Where("user_id = ? AND good_id = ? AND sku_id = ?",
		c.UserId, c.GoodId, c.SkuId).First(&existing)
	if result.Error != nil {
		// 2. 不存在则创建新收藏：先查询商品信息
		if result.Error == gorm.ErrRecordNotFound {
			// 2.1 通过GoodId查询商品表，获取名称和价格
			var good model.Good
			if err := config.DB.Where("id = ?", c.GoodId).First(&good).Error; err != nil {
				if err == gorm.ErrRecordNotFound {
					return errors.New("商品不存在")
				}
				return fmt.Errorf("查询商品信息失败: %v", err)
			}
			// 2.2 赋值商品名称和价格到收藏记录
			c.Name = good.StoreName
			c.Price = good.Price
			c.Num = 1 // 新收藏默认数量为1

			// 2.3 创建收藏记录
			return config.DB.Create(&c).Error
		}
		return result.Error // 其他查询错误
	}

	// 3. 已存在则返回提示错误
	return errors.New("该商品已在收藏中")
}

// 清空用户的所有收藏
func (c *Collection) ClearAll() error {
	return config.DB.Where("user_id = ?", c.UserId).Delete(&Collection{}).Error
}

// 指定删除一个商品收藏
func (c *Collection) DeletedCollection() error {
	return config.DB.Delete(&c).Error
}

// 批量删除商品收藏
func BatchDeleteCollections(ids []uint32) error {
	return config.DB.Where("id = ?", ids).Delete(&Collection{}).Error
}

// 获取用户的收藏列表（分页）
func (c *Collection) GetCollectionList(page, pageSize int) ([]Collection, int64, error) {
	var list []Collection
	var total int64
	// 计算总数
	if err := config.DB.Model(&Collection{}).
		Where("user_id = ?", c.UserId).
		Count(&total).Error; err != nil {
		return nil, 0, err
	}
	// 计算偏移量
	offset := (page - 1) * pageSize
	// 查询列表并关联商品信息
	err := config.DB.Preload("Good").
		Where("user_id = ?", c.UserId).
		Order("updated_at DESC").
		Limit(pageSize).
		Offset(offset).
		Find(&list).Error
	return list, total, err
}

// 收藏搜索列表（模糊搜索）
func (c *Collection) SearchCollections(keyword string, page, pageSize int) ([]Collection, int64, error) {
	var list []Collection
	var total int64
	// 计算总数
	if err := config.DB.Model(&Collection{}).
		Where("collection.user_id = ? AND collection.name LIKE ?",
			c.UserId, "%"+keyword+"%").
		Count(&total).Error; err != nil {
		return nil, 0, err
	}
	// 计算偏移量
	offset := (page - 1) * pageSize
	// 搜索列表并关联商品信息
	err := config.DB.Preload("Good").
		Joins("left join good on collection.good_id = good.id").
		Where("collection.user_id = ? AND good.name LIKE ?",
			c.UserId, "%"+keyword+"%").
		Order("collection.updated_at DESC").
		Limit(pageSize).
		Offset(offset).
		Find(&list).Error

	return list, total, err
}
